home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 4 / Apprentice-Release4.iso / Languages / Caml Light 0.7 / Caml Light 0.7 source / src / yacc / parsing.c < prev    next >
Text File  |  1995-06-01  |  3KB  |  137 lines

  1. int yydebug;
  2. int yynerrs;
  3. int yyerrflag;
  4. int yychar;
  5. short *yyssp;
  6. YYSTYPE *yyvsp;
  7. YYSTYPE yyval;
  8. YYSTYPE yylval;
  9. short yyss[YYSTACKSIZE];
  10. YYSTYPE yyvs[YYSTACKSIZE];
  11. #define yystacksize YYSTACKSIZE
  12. #define YYABORT goto yyabort
  13. #define YYACCEPT goto yyaccept
  14. #define YYERROR goto yyerrlab
  15.  
  16. value yyparse(tables, entrypoint, lexbuf)
  17.      value tables, entrypoint, lexbuf;
  18. {
  19.     register int yym, yyn, yystate;
  20.  
  21. #define yyact FIELD(tables,0)
  22. #define yytransl FIELD(tables,1)
  23. #define yylhs FIELD(tables, 2)
  24. #define yylen FIELD(tables, 3)
  25. #define yydefred FIELD(tables, 4)
  26. #define yydgoto FIELD(tables, 5)
  27. #define yysindex FIELD(tables, 6)
  28. #define yyrindex FIELD(tables, 7)
  29. #define yygindex FIELD(tables, 8)
  30. #define YYTABLESIZE CINT(FIELD(tables, 9))
  31. #define yytable FIELD(tables, 10)
  32. #define yycheck FIELD(tables, 11)
  33.  
  34.     yynerrs = 0;
  35.     yyerrflag = 0;
  36.     yychar = (-1);
  37.  
  38.     yyssp = yyss;
  39.     yyvsp = yyvs;
  40.     *yyssp = yystate = 0;
  41.  
  42.     yychar = CINT(entrypoint);
  43.  
  44. yyloop:
  45.     if (yyn = yydefred[yystate]) goto yyreduce;
  46.     if (yychar < 0) {
  47.       token = yylex(lexbuf);
  48.       yychar = CINT(yytransl[TAG(token)]);
  49.       yylval = FIELD(token, 0);
  50.     }
  51.     if ((yyn = CINT(yysindex[yystate])) && (yyn += yychar) >= 0 &&
  52.         yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == yychar) 
  53.     {
  54.         if (yyssp >= yyss + yystacksize - 1) grow_stacks();
  55.  
  56.         *++yyssp = yystate = CINT(yytable[yyn]);
  57.         *++yyvsp = yylval;
  58.         yychar = (-1);
  59.         if (yyerrflag > 0)  --yyerrflag;
  60.         goto yyloop;
  61.     }
  62.     if ((yyn = CINT(yyrindex[yystate])) && (yyn += yychar) >= 0 &&
  63.             yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == yychar)
  64.     {
  65.         yyn = yytable[yyn];
  66.         goto yyreduce;
  67.     }
  68.     if (yyerrflag) goto yyinrecovery;
  69.  
  70. yynewerror:
  71.     v = alloc(1, EXN_PARSING);
  72.     FIELD(v, 0) = MLINT(yychar);
  73.     mlraise(v);
  74.  
  75. yyerrlab:
  76.     ++yynerrs;
  77.  
  78. yyinrecovery:
  79.     if (yyerrflag < 3)
  80.     {
  81.         yyerrflag = 3;
  82.         for (;;)
  83.         {
  84.             if ((yyn = CINT(yysindex[*yyssp])) && (yyn += YYERRCODE) >= 0 &&
  85.                     yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == YYERRCODE)
  86.             {
  87.                 if (yyssp >= yyss + yystacksize - 1) grow_stacks();
  88.  
  89.                 *++yyssp = yystate = yytable[yyn];
  90.                 *++yyvsp = yylval;
  91.                 goto yyloop;
  92.             }
  93.             else
  94.             {
  95.                 if (yyssp <= yyss) goto yyabort;
  96.                 --yyssp;
  97.                 --yyvsp;
  98.             }
  99.         }
  100.     }
  101.     else
  102.     {
  103.         if (yychar == 0) goto yyabort;
  104.         yychar = (-1);
  105.         goto yyloop;
  106.     }
  107.  
  108. yyreduce:
  109.     yym = yylen[yyn];
  110.     yyval = mlapply(FIELD(yyact, yyn), atom(0));
  111.     yyssp -= yym;
  112.     yystate = *yyssp;
  113.     yyvsp -= yym;
  114.     yym = yylhs[yyn];
  115.     if (yystate == 0 && yym == 0)
  116.     {
  117.         yystate = YYFINAL;
  118.         *++yyssp = YYFINAL;
  119.         *++yyvsp = yyval;
  120.         if (yychar < 0)
  121.         {
  122.             if ((yychar = yylex()) < 0) yychar = 0;
  123.         }
  124.         if (yychar == 0) goto yyaccept;
  125.         goto yyloop;
  126.     }
  127.     if ((yyn = CINT(yygindex[yym])) && (yyn += yystate) >= 0 &&
  128.             yyn <= YYTABLESIZE && CINT(yycheck[yyn]) == yystate)
  129.         yystate = CINT(yytable[yyn]);
  130.     else
  131.         yystate = CINT(yydgoto[yym]);
  132.     if (yyssp >= yyss + yystacksize - 1) grow_stacks();
  133.     *++yyssp = yystate;
  134.     *++yyvsp = yyval;
  135.     goto yyloop;
  136. }
  137.